package com.bear.newsset.util;

import androidx.annotation.NonNull;

import com.alibaba.fastjson.JSONObject;
import com.bear.newsset.entity.Response;
import com.ybear.networkutil.HttpManage;
import com.ybear.networkutil.enums.RECOUNT_TRIGGER;
import com.ybear.networkutil.request.Request;

import java.io.IOException;
import java.io.Serializable;

import okhttp3.Call;
import okhttp3.ResponseBody;

/**
 * 网络请求工具类
 *
 * @see #requestResponse(Request, Class, CallbackResponse)
 */
public class HttpUtil {
    public interface CallbackResponse<S extends Serializable> {
        void request(Response<S> response);
    }

    /**
     * 发送请求
     * {@link S} 在创建 {@link CallbackResponse<S>} 的时候进行泛型。
     * {@link R} 保证传入的 request 实现了这个泛型就能自动推断。
     *
     * @param request       请求类，设置链接、参数、回调...
     * @param response      回调的响应数据
     * @param <S>           泛型的响应。例如一个实体类，它必须实现这个泛型
     * @param <R>           泛型的请求类。同样，也必须实现这个泛型
     */
    public static <S extends Serializable, R extends Request>
    void requestResponse(@NonNull R request, Class<S> cls, @NonNull CallbackResponse<S> response) {
        //返回的数据
        request.setCallback(new com.ybear.networkutil.HttpUtil.Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                LogUtils.d("requestResponse.onFailure", e.toString());
                response.request( new Response<>() );
            }

            @Override
            public void onResponse(@NonNull Call call,
                                   @NonNull okhttp3.Response okres) throws IOException {
                LogUtils.d("requestResponse.onResponse",  okres.toString());
                ResponseBody body = okres.body();
                String s = body == null ? null : body.string();
                LogUtils.d("onResponse", s);
                Response<S> r = new Response<>();
                if( s == null || s.equals("") ) {
                    response.request( r );
                    return;
                }
                try {
                    JSONObject jsonObj = JSONObject.parseObject( s );
                    Integer status = jsonObj.getInteger("status");
                    Long timeStamp = jsonObj.getLong("timestamp");
                    S data = jsonObj.getObject("data", cls);
                    //返回的状态
                    r.setStatus( status != null ? status : 400 );
                    //从服务器返回的时间
                    r.setTimestamp( timeStamp != null ? timeStamp : System.currentTimeMillis() );
                    //获取返回的数据
                    if( data != null ) { r.setData( data ); }
                    if( r.getData() == null ) r.setStatus( 400 );
//                    r = JSONObject.parseObject(s, new TypeReference<Response<S>>() {});
                }catch (Exception e) {
                    e.printStackTrace();
                }
                response.request( r );
            }
        });
        //Post请求
//        com.ybear.networkutil.HttpUtil.sendPostCallString( request );

        HttpManage.getInstance()
                .setMaxReCount(3)                               //最大重试次数 3 次
                .setTriggers(
                        RECOUNT_TRIGGER.EXIST_RESPONSE,         //存在其他网络请求时
                        RECOUNT_TRIGGER.NETWORK_AVAILABLE,      //网络正常时
                        RECOUNT_TRIGGER.NETWORK_SWITCH          //切换网络时
                )
                .sendPost( request );
    }

    public static
    <T extends com.ybear.networkutil.request.Request> String fromatUrl(@NonNull T request) {
        return com.ybear.networkutil.HttpUtil.fromatUrl( request );
    }
}